package com.autoglm.android.core

import android.util.Log
import com.autoglm.android.core.llm.LLMService
import com.autoglm.android.core.models.UserIntent
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import org.json.JSONObject

/**
 * 意图识别器，负责将用户的自然语言指令转换为结构化意图
 */
class IntentRecognizer(
    private val llmService: LLMService
) {
    companion object {
        private const val TAG = "IntentRecognizer"
        
        // 用于指示大模型输出的系统提示词
        private const val SYSTEM_PROMPT = """
            你是一个专业的语音指令解析器。你的任务是将用户的自然语言指令转换为结构化的JSON格式。
            
            解析规则：
            1. 识别指令中的目标应用（如"高德地图"、"微信"等）
            2. 识别指令中的主要动作（如"打开"、"导航到"、"切换视图"等）
            3. 识别指令中的位置信息（如果有）
            4. 识别指令中的显示模式（如"3D"、"卫星视图"等，如果有）
            5. 识别后续操作（如"截图"、"分享"等，如果有）
            
            输出必须是可解析的JSON格式，包含以下字段：
            {
              "targetApp": "应用名称",
              "action": "主要动作",
              "location": "位置信息", // 如果没有则为null
              "displayMode": "显示模式", // 如果没有则为null
              "followUpActions": ["操作1", "操作2"] // 如果没有则为空数组
            }
            
            请确保输出的JSON格式正确无误，不要添加任何多余的解释或说明。
        """.trimIndent()
    }
    
    /**
     * 识别用户意图，将自然语言转换为结构化意图
     * 
     * @param userCommand 用户的自然语言指令
     * @return 包含识别状态和结果的Flow
     */
    fun recognizeIntent(userCommand: String): Flow<IntentRecognitionState> = flow {
        // 发送正在识别状态
        emit(IntentRecognitionState.Processing(userCommand))
        
        try {
            // 调用大模型进行意图识别
            val response = llmService.generateText(
                systemPrompt = SYSTEM_PROMPT,
                userPrompt = userCommand
            )
            
            // 解析响应中的JSON
            val userIntent = parseIntentFromResponse(response)
            
            // 发送识别成功状态
            emit(IntentRecognitionState.Success(userIntent))
        } catch (e: Exception) {
            Log.e(TAG, "Intent recognition failed", e)
            // 发送识别失败状态
            emit(IntentRecognitionState.Error("意图识别失败: ${e.message}"))
        }
    }
    
    /**
     * 从大模型响应中解析出结构化意图
     */
    private fun parseIntentFromResponse(response: String): UserIntent {
        try {
            // 尝试直接解析JSON
            return UserIntent.fromJson(response)
        } catch (e: Exception) {
            Log.w(TAG, "Failed to parse direct JSON response, attempting to extract JSON from text", e)
            
            // 尝试从文本中提取JSON
            val jsonPattern = "\\{[\\s\\S]*\\}"
            val regex = Regex(jsonPattern)
            val matchResult = regex.find(response)
            
            if (matchResult != null) {
                val jsonString = matchResult.value
                return UserIntent.fromJson(jsonString)
            } else {
                throw IllegalArgumentException("无法从响应中提取有效的JSON: $response")
            }
        }
    }
}

/**
 * 意图识别状态
 */
sealed class IntentRecognitionState {
    /** 正在处理意图识别 */
    data class Processing(val userCommand: String) : IntentRecognitionState()
    
    /** 意图识别成功 */
    data class Success(val intent: UserIntent) : IntentRecognitionState()
    
    /** 意图识别失败 */
    data class Error(val message: String) : IntentRecognitionState()
} 